iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
AI/ ML & Data

從投信數據預測葛蘭碧突破後股價走勢系列 第 15

[Day 15] 資料收集與準備 - 資料前處理(2)

  • 分享至 

  • xImage
  •  

前言

上一回我們聊到投信數據的處理,這篇來講講價量和投信兩邊都要處理的部分,包括清除非必要欄位缺失值處理

清除非必要欄位

在處理資料的第一步,就是把那些不需要的欄位先清掉。因為有些數據是後續可以直接計算出來的,比如 "漲跌幅",或者籌碼資料裡的 "Investment Trust" 這類多餘的項目。這樣不僅可以節省存儲空間,還能更專注於我們要處理的重要欄位,尤其是處理缺失值時,更方便不同來源數據的整合。

價量方面

以台泥(1101)為例,這是我們抓下來的資料:

date stock_id Trading_Volume Trading_money open max min close spread Trading_turnover
2020-01-02 1101 18470566 813465904 43.8 44.15 43.8 44.1 0.4 6251
2020-01-03 1101 18387114 807459827 44.15 44.25 43.45 43.95 -0.15 6733

像這裡的 spreadTrading_turnover 就沒什麼用了,我們只要保留 日期股票代碼成交量開盤價最高價最低價收盤價 這幾個欄位就好。下面這段程式碼就是處理的方式:

import pandas as pd

df = pd.read_csv('C:\\path_to_csv.csv')
df_cleaned = df[['date', 'stock_id', 'Trading_Volume', 'open', 'max', 'min', 'close']]
df_cleaned.to_csv('C:\\path_to_cleaned_csv.csv', index=False)

籌碼方面

再來看籌碼資料,還是以台泥(1101)為例,這是我們的原始資料:

date stock_id buy name sell Buy_Sell_Net
2020-01-02 1101 0 Investment_Trust 5000 -5000
2020-01-03 1101 14000 Investment_Trust 0 14000

這邊我們只需要 日期股票代碼買賣超 這三個欄位就夠了,其他的欄位都可以刪掉。程式碼如下:

import pandas as pd

df = pd.read_csv('C:\\path_to_csv.csv')
df_cleaned = df[['date', 'stock_id', 'Buy_Sell_Net']]
df_cleaned.to_csv('C:\\path_to_cleaned_csv.csv', index=False)

缺失值處理

資料範圍與處理目標

我們這次處理的資料範圍是2020-01-01到2024-09-27,針對那些有投信買賣數據的股票,透過和加權指數的日期比對,找出資料中的異常缺失。

缺失值分類

根據資料的狀況,缺失值的原因大致可以分成三類:

  1. 股票還沒上市或還沒開始交易
    有些股票可能在資料開始的時候還沒上市或還沒開始交易,這類缺失我們視為合理的,不需要補全。

  2. 股票暫停交易或處置狀態
    有些股票在特定日期因為暫停交易或處置而沒有資料,這些缺失也算是合理的,也不用補全。

  3. FinMind 自身的缺失
    FinMind 的資料有時候會出現缺失,這類異常缺失我們需要從其他數據來源補齊,像 XQ 或 Yahoo Finance。不過這次我們只會用 XQ,因為我發現 yfinance 的數據有時候不太準。


缺失值處理流程

1. 上市前無交易資訊之股票

股票還沒上市時,資料中會出現連續的缺失,直到某一天開始有數據。這時候我們可以合理判斷,早期的缺失是因為股票還沒上市或沒開始交易,所以這些缺失值可以被視為合理的,不用再處理。

具體步驟

  1. 讀取資料:讀取每支股票的日期資料,按日期排序,確保資料順序是正確的。
  2. 檢查缺失情況:遍歷每支股票的日期,找出連續缺失的部分。
  3. 標記合理缺失:找到股票開始有數據的那天,將這天之前的所有缺失標記為合理缺失,這部分不用補全。
  4. 排除合理缺失:將這些合理缺失從最終的缺失清單中排除,避免在後續補全時再重複處理。

2. 暫停交易之股票

有些股票會因為公司暫停交易或處置,導致特定日期的數據缺失,這類缺失是正常的,不需要補全。我們通常會透過公告來確認這些情況。

步驟

  1. 查公告
    可以透過證交所網站這裡或櫃買中心網站這裡來查詢相關公告,看看哪些股票在特定日期暫停交易或處置,然後記錄下來。

  2. 標記合理缺失
    確定某支股票在特定日期暫停交易後,我們就把這些日期的數據標記為合理缺失,不需要再補全。

  3. 排除合理缺失
    跟上市前無交易資訊的情況一樣,這些合理缺失在後續補全過程中會被排除,避免被誤當成異常缺失。

注意
雖然我們可以透過證交所和櫃買中心的網站查到一些暫停交易的資料,但有些資訊可能不完整,所以還要靠其他媒體或新聞來源確認該股票是否在某個日期真的暫停交易。確定後,才會把缺失值排除掉。


3. FinMind 自身的缺失值

FinMind 的資料有時候會出現缺失,這種情況通常是異常的,無法視為合理缺失。為了確保資料的完整性,我們需要從其他數據來源補齊這些缺失。在這裡,我們只會用 XQ 來補齊,因為我們發現 yfinance 有時候抓下來的數據會有錯誤,為了避免這些問題,決定只用 XQ 的數據。

步驟

  1. 找出異常缺失
    比對加權指數的完整日期,找出那些 FinMind 資料源的異常缺失。

  2. 從 XQ 補齊數據
    利用 XQ 的數據補齊這些缺失。我們選擇 XQ 是因為它的數據相對穩定,歷史交易數據準確,可以避免 yfinance 可能帶來的數據錯誤。

  3. 標記無法補齊的數據
    如果有些數據實在無法補齊,我們會記錄下這些日期和股票,並標註為無法補齊,方便後續處理。


資料結合

在處理完缺失值後,接下來就是把價量數據和籌碼數據進行結合,這樣我們就可以在一個資料集裡看到完整的價量和籌碼資訊。這個步驟非常重要,因為後續的分析或是模型訓練,都需要這些資料整合在一起,才能提供更好的預測效果。

步驟

  1. 資料合併
    首先,我們會針對每支股票,將處理過的價量數據與籌碼數據進行合併,並按照日期對齊。這樣不管是價量資訊,還是投信的籌碼動向,都能在同一份資料裡同步呈現。

  2. 填補缺失數據
    如果某些日期只有價量數據,沒有籌碼數據,或反過來,只有籌碼數據沒有價量數據,我們會用空值(NaN)來補齊,這樣能保證每個日期都有完整的欄位,方便後續分析。

  3. 保存資料
    最後,將這些合併後的資料保存成一個新的 CSV 檔案,這份資料集將會成為我們後續 LSTM 模型訓練和預測的基礎資料。


上一篇
[Day 14] 資料收集與準備-資料前處理(1)
下一篇
[Day 16] 資料收集與準備 - 特徵選擇(1)
系列文
從投信數據預測葛蘭碧突破後股價走勢17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言